package com.mycompany.service.impl;

import java.util.List;

import javax.jws.WebService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mycompany.dao.ControlAccesoDao;
import com.mycompany.exception.ParamException;
import com.mycompany.model.ControlAcceso;
import com.mycompany.service.ControlAccesoManager;

/**
 * Implementacion de Manager para operaciones CRUD de objetos control de acceso
 * @author javachavez@gmail.com
 *
 */
@Service("controlAccesoManager")
@WebService(serviceName = "ControlAccesoService", endpointInterface = "com.mycompany.service.ControlAccesoManager")
public class ControlAccesoManagerImpl implements ControlAccesoManager { //extends GenericManagerImpl<ControlAcceso, Long> implements ControlAccesoManager {
	
	ControlAccesoDao controlAccesoDao;

    public ControlAccesoManagerImpl() {}

    @Autowired
    public ControlAccesoManagerImpl(ControlAccesoDao controlAccesoDao) {
        this.controlAccesoDao = controlAccesoDao;
    }

	/**
	 * Obtiene lista de Control de accesos
	 * @return lista de control de accesos
	 */
    public List<ControlAcceso> readAll(){
    	return controlAccesoDao.get();
    }
   
   /** 
	* Obtiene Control de acceso
    * @param id del control de acceso a obtener
    * @return control de accesos
    */
    public ControlAcceso read(Long id){
    	return controlAccesoDao.get(id);
    }
    
   
   /**
    * Borra control de acceso dado segun parametro
    * @param id del control de acceso a borra
    * @return boolean si se ha borrado la lista de acceso
    */
    public boolean remove(Long id){
    	return controlAccesoDao.remove(id);
    }
   
    /**
     * Crea control de acceso dado segun parametro
     * @param ca control de acceso a crear
     * @return ControlAcceso creado.
     * @throws Exception 
     */
    public ControlAcceso create(ControlAcceso ca) throws ParamException{
    	checksBeforeUpdateOrCreate(ca);
    	return controlAccesoDao.create(ca);
     }
     
     /**
      * Crea control de acceso dado segun parametro
      * @param ca control de acceso a crear
      * @return ControlAcceso creado.
     * @throws Exception 
      */
    public boolean update(ControlAcceso ca) throws ParamException{
    	checksBeforeUpdateOrCreate(ca);
     	return controlAccesoDao.update(ca);
     }
    
    /**
     * Chequea parametros de Control Acceso antes de guardar o actualizar.
     * @param ca objeto a chequear
     * @throws ParamException
     */
    public void checksBeforeUpdateOrCreate (ControlAcceso ca) throws ParamException{
    	if(ca.getOrigen()==null)
    	{
    		throw new ParamException("Origen no puede ser nulo"); 
    	}
    	if(ca.getDestino()==null)
    	{
    		throw new ParamException("Destino no puede ser nulo"); 
    	}
    	if(ca.getProtocolo()==null||(!ca.getProtocolo().equalsIgnoreCase("UDP")&&!ca.getProtocolo().equalsIgnoreCase("TCP")))
    	{
    		throw new ParamException("Parametro protocolo debe ser: UDP o TCP"); 
    	}
    	if(ca.getAccion()==null||(!ca.getAccion().equalsIgnoreCase("DENY")&&!ca.getAccion().equalsIgnoreCase("ALLOW")))
    	{
    		throw new ParamException("Parametro aacion debe ser: ALLOW o DENY"); 
    	}	
     }
}